Sistema de gestão de compras, vendas e estoque para vendedores do Mercado Livre (e outros marketplaces). Construído em Angular 18 + Material, com tema light/dark, gráficos interativos e sincronização em tempo real via Firebase.
- 📦 Estoque — visão executiva com KPIs, status de cada lote, alertas visuais (amarelo ≥25 dias, vermelho ≥30 dias).
- 🛒 Compras — cadastro de lotes com cálculo automático de custo total real (custo + frete + outros).
- 💰 Vendas — registro de cada venda individual, com taxa ML customizável por venda, suporte a envio Correios e Flex, vínculo ao lote via ID e cálculo de lucro/margem em tempo real.
- 📈 Dashboard — gráficos de evolução mensal, ranking de produtos, composição da receita e capital parado.
- 📊 Análises — resumos por produto, categoria e mês com tabelas detalhadas.
- ⚙️ Configurações — taxa padrão, margem mínima, dias de alerta, listas editáveis.
- 🌗 Light/Dark mode com persistência e detecção da preferência do sistema.
- 💾 Backup — exportação e importação de dados em JSON.
- 🔐 Login por usuário — cada loja tem seus próprios dados isolados via Firebase Auth.
- ☁️ Sincronização automática — dados salvos no Firestore, acessíveis em qualquer dispositivo.
- 📱 Responsivo — funciona em desktop, tablet e mobile.
- Node.js 18.19+ ou 20.11+
- npm 9+
- Projeto Firebase configurado (veja a seção abaixo)
# 1. Instale as dependências
npm install
# 2. Configure o Firebase (preencha src/environments/environment.ts)
# 3. Rode em modo desenvolvimento
npm start
# Abre em http://localhost:4200
# 4. Build de produção
npm run build
# Gera os arquivos em dist/ml-gestao/browser- Angular 18 — framework
- Angular Material 18 — componentes UI
- Firebase 10 + @angular/fire — autenticação e banco de dados em tempo real
- Chart.js + ng2-charts — gráficos
- TypeScript 5.5 — tipagem estrita
- Inter — tipografia
Este guia explica como conectar o Lucrato ao seu projeto Firebase para habilitar sincronização em tempo real e login de usuários.
- Conta Google (gmail.com ou similar)
- Node.js 18+ instalado
- Projeto clonado e dependências instaladas (
npm install)
- Acesse console.firebase.google.com
- Clique em "Adicionar projeto"
- Escolha um nome (ex:
lucrato-minha-loja) - Desative o Google Analytics (opcional) e clique em Criar projeto
- Aguarde a criação e clique em Continuar
- Na tela inicial do projeto, clique no ícone
</>(Web) - Dê um apelido ao app (ex:
lucrato-web) — não marque "Firebase Hosting" - Clique em Registrar app
- O Firebase vai exibir um bloco de código com
firebaseConfig. Copie esses valores — você vai precisar deles no Passo 5:
const firebaseConfig = {
apiKey: "AIzaSy...",
authDomain: "meu-projeto.firebaseapp.com",
projectId: "meu-projeto",
storageBucket: "meu-projeto.appspot.com",
messagingSenderId: "123456789",
appId: "1:123456789:web:abc123"
};- Clique em Continuar no console
- No menu lateral do Firebase, clique em Authentication
- Clique na aba "Sign-in method"
- Clique em "E-mail/senha"
- Ative o primeiro interruptor (E-mail/senha) e clique em Salvar
- No menu lateral, clique em Firestore Database
- Clique em "Criar banco de dados"
- Escolha "Começar no modo de produção" e clique em Avançar
- Selecione a região mais próxima (ex:
southamerica-east1para São Paulo) e clique em Ativar - Aguarde a criação do banco
As regras restritivas já estão versionadas em firestore.rules na raiz do projeto. Use o Firebase CLI para publicá-las (não cole manualmente no console):
npx firebase-tools login # 1ª vez
npx firebase-tools deploy --only firestore:rules --project lucrato-webAs regras restringem cada usuário ao seu próprio subtree e exigem e-mail verificado. Sem este deploy, qualquer pessoa autenticada poderia acessar dados de outros usuários.
- Abra o arquivo
src/environments/environment.tsno projeto - Substitua os valores placeholder pelos que você copiou no Passo 2:
export const environment = {
production: false,
firebase: {
apiKey: 'AIzaSy...',
authDomain: 'meu-projeto.firebaseapp.com',
projectId: 'meu-projeto',
storageBucket: 'meu-projeto.appspot.com',
messagingSenderId: '123456789',
appId: '1:123456789:web:abc123',
},
};- Faça o mesmo no arquivo
src/environments/environment.prod.ts
npm startAbra http://localhost:4200 no navegador.
- Na primeira vez, você verá a tela de Login
- Clique em "Criar conta" para registrar seu e-mail, senha e nome da loja
- Após o cadastro, você será redirecionado para o Estoque
- Os dados são salvos automaticamente no Firestore e sincronizados em todos os dispositivos
App Check bloqueia chamadas à API Firestore que não venham do seu domínio autorizado, protegendo contra bots e abuso de cota mesmo se a API key vazar.
- No Firebase Console → projeto → App Check → registrar a app web
- Escolher provider reCAPTCHA Enterprise
- Em
console.cloud.google.com → Security → reCAPTCHA Enterprise, criar uma chave para:localhost(dev)- domínio de produção (ex.:
lucrato-web.vercel.app)
- Copiar o site key (público) e colar nos environments:
- src/environments/environment.ts —
recaptchaSiteKey - src/environments/environment.prod.ts —
recaptchaSiteKey
- src/environments/environment.ts —
- Em Firebase Console → App Check → APIs → Cloud Firestore, ativar Enforce quando estiver confiante (recomendado: rodar uma semana em "unenforced" primeiro pra ver métricas)
Debug token (dev local): main.ts habilita FIREBASE_APPCHECK_DEBUG_TOKEN automaticamente. Na primeira execução npm start, o console do navegador mostrará um token — copie e registre em Firebase Console → App Check → Apps → ⋯ → Manage debug tokens, senão chamadas locais falharão depois do Enforce.
Cada usuário tem um documento exclusivo no caminho:
users/{uid}/db/main
npm run buildOs arquivos gerados ficam em dist/. Podem ser hospedados em qualquer servidor estático (Firebase Hosting, Netlify, Vercel, etc.).
npm install -g firebase-tools
firebase login
firebase init hosting
npm run build
firebase deployA aplicação implementa defesa em profundidade nas seguintes camadas:
| Camada | Onde |
|---|---|
Firestore Rules: isolamento por UID + email_verified + validação de formato/tamanho + deny-all |
firestore.rules |
| App Check (reCAPTCHA Enterprise) | src/app/app.config.ts |
| HTTP security headers (CSP, HSTS, X-Frame, nosniff, Referrer, Permissions) | vercel.json |
| Verificação de e-mail obrigatória (guard + rules) | src/app/core/guards/auth.guard.ts |
| Política de senha forte (8+ chars, letra+número) | src/app/core/services/password-validator.ts |
| Forgot password (sem enumeração de contas) | src/app/features/auth/forgot-password.dialog.ts |
| Re-autenticação antes de trocar senha / excluir conta | src/app/features/profile/profile.component.ts |
| Limites de upload XLSX (5 MB, 5000 linhas/aba, extensão) | src/app/features/settings/settings.component.ts |
| Leitura de planilha pela build corrigida do SheetJS (xlsx 0.20.x) | src/app/core/services/import.service.ts |
| Logs detalhados desligados em produção | src/app/core/services/logger.ts |
Algumas proteções não vivem no código — precisam ser ativadas nos consoles do Firebase / Google Cloud. Faça este checklist no setup e revise periodicamente:
- App Check em "Enforce" — Firebase Console → App Check → Cloud Firestore → Enforce. Rode ~1 semana em "unenforced" primeiro para conferir métricas.
- Proteção contra enumeração de e-mail — Firebase Console → Authentication → Settings → Email enumeration protection (ativar). Impede descobrir quais e-mails têm conta pelo cadastro.
- Restringir a API key Web — Google Cloud Console → APIs & Services → Credentials → a Browser key →
Application restrictions = HTTP referrers (
localhost+ domínio de produção) e API restrictions = só as APIs usadas (Identity Toolkit, Cloud Firestore, App Check, Firebase Installations). AapiKeynoenvironment.tsé pública por design, mas a restrição impede reuso/abuso de cota a partir de outros domínios. - Backups do Firestore — Firebase Console → Firestore → Point-in-time recovery (ativar) e/ou agendar exports para um bucket GCS. Recupera dados após exclusão acidental ou maliciosa.
- Publicar as Firestore Rules após qualquer alteração:
npx firebase-tools deploy --only firestore:rules --project lucrato-web— teste antes no Rules Playground / emulador para não bloquear gravações legítimas.
- CSP /
unsafe-inlineem estilos: a diretivastyle-srcpermite'unsafe-inline'porque o Angular Material injeta estilos inline (necessário). Os scripts não permitemunsafe-inline/unsafe-eval(apenaswasm-unsafe-eval), mantendo a proteção anti-XSS importante. Se algum recurso bloquear em produção, abra DevTools → Console no domínio Vercel e ajuste a diretiva correspondente em vercel.json. - Parser de planilha: a leitura de arquivos enviados usa a build oficial corrigida do SheetJS,
instalada a partir do CDN deles (o registro npm está congelado numa versão vulnerável — CVE-2023-30533 /
CVE-2024-22363). Para reproduzir o ambiente após um clone limpo:
npm install --save https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz. Oxlsx-js-stylepermanece apenas para gerar planilhas estilizadas (a escrita não processa entrada não-confiável).
- Revisar textos e labels
- Revisar codigo
- Revisar texto de instruções
- Redistribuir o codigo (html so com html, css so com css e ts so com ts)
- Ler como ficou o texto das instruções
- Rever calculos da aplicação
- mais idiomas (i18n)